#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

typedef int dataType;
typedef struct SL{
    int *arr;   //存储数组的指针
    int size;   //存储数组中有效数据的数量
    int capacity;   //空间容量
}SL;
void init(SL *p){
    p->arr=NULL;
    p->size=0;
    p->capacity=0;
}
//销毁动态开辟的内存空间
void destory(SL *p){
    free(p->arr);
    p->arr=NULL;
    p->size=0;
    p->capacity=0;
}
//扩容
void checkCappcity(SL *p){
    if(p->size==p->capacity){
        //申请空间
        int newCapacity=p->capacity==0?4:2*p->capacity;
        int *temp = realloc(p->arr,sizeof (int)*newCapacity);
        if(temp==NULL){
            printf("扩容失败");
        }
        p->arr=temp;
        p->capacity=newCapacity;
        printf("%d\n",p->capacity);
    }
}
//打印数组
void Slprintf(SL *p){
    for (int i = 0; i < p->size; ++i) {
        printf("%d\n",p->arr[i]);
    }
}
//尾部插入元素
void pushback(SL *p,int n){
    checkCappcity(p);
    p->arr[p->size++]=n;
}
//头部插入元素
void pushfront(SL *p,int n){
    checkCappcity(p);
    for (int i = p->size; i > 0 ; i--) {
        p->arr[i]=p->arr[i-1];
    }
    p->arr[0]=n;
    p->size++;
}
//任意位置插入元素
void insert(SL *p,int pos,int n){
    if(pos>=0 && pos<=p->size){
        checkCappcity(p);
        for (int i = p->size ; i > pos ; i--) {
            p->arr[i]=p->arr[i-1];
        }
        p->arr[pos]=n;
        p->size++;
    }else{
        printf("插入的元素位置应该在顺序表的范围内");
    }
}
//删除表头
void deleteFor(SL *p){
    for (int i = 0; i < p->size-1; ++i) {
        p->arr[i]=p->arr[i+1];
    }
    p->size--;
}
//删除任意位置的元素
void del(SL *p,int pos){
    assert(pos>=0 && pos <= p->size);
    for (int i = pos; i < p-> size; ++i) {
        p->arr[i]=p->arr[i+1];
    }
    p->size--;
}
void insert2(SL *p,dataType x ,int pos) {
    if(pos>0&&pos<=p->size) {
        checkCappcity(p);
        for (int i = p->size; i > pos; i--) {
            p->arr[i] = p->arr[i-1];
        }
        p->arr[pos] = x;
        p->size++;
    } else {
        printf("error\n");
    }
}
void printfSL(SL *p) {
    for (int i = 0; i < p->size; i++) {
        printf("%d ",p->arr[i]);
    }
}
int find(SL *p,dataType x) {
    for (int i = 0; i < p->size; i++) {
        if (p->arr[i] == x) {
            return i;
        }

    }
    return -1;
}
int main(){
    SL L;
    init(&L);
//    destory(&L);
//    checkCappcity(&L);
    pushback(&L,15);
    pushfront(&L,12);
    insert(&L,1,23);
    Slprintf(&L);
    deleteFor(&L);
    del(&L,1);
    printf("%d\n",L.size);
    printf("%d\n",L.capacity);
    insert2(&L,1,0);
    insert2(&L,2,1);
    insert2(&L,3,2);
    printf(&L);
    find(&L,0);
    find(&L,1);
    return 0;
}